package com.bolt.support.query.nativequery;

import com.bolt.convention.data.PageInfo;
import com.bolt.convention.data.Record;
import com.bolt.support.query.nativequery.parall.ParallelQuery;
import com.bolt.support.query.nativequery.parall.ParallelQueryConfig;
import com.bolt.support.query.nativequery.parall.ParallelQueryResult;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.data.domain.Pageable;

import java.util.List;

/**
 * Created by Administrator on 2021/4/19.
 */
public interface IQuery {
    /**
     * 分页查询
     * @param sqlId 配置SQL ID
     * @param pageable 分页参数
     * @param parameterObject 查询入参
     * @param returnClass 返回类型
     * @param <S>
     * @return
     */
    <S> PageInfo <S> findPage(String sqlId, Pageable pageable, Object parameterObject, Class <S> returnClass);

    /**
     * 分页查询（MAP类型返回）
     * @param sqlId 配置SQL ID
     * @param pageable 分页参数
     * @param parameterObject 查询入参
     * @return
     */
    PageInfo <Record> findPage(String sqlId, Pageable pageable, Object parameterObject);

    /**
     * LIST强结查询
     * @param sqlId 配置SQL ID
     * @param parameterObject  查询入参
     * @param returnClass 返回类型
     * @param <S>
     * @return
     */
    <S> List <S> findList(String sqlId, Object parameterObject, Class <S> returnClass);

    /**
     * LIST强结查询 （MAP类型返回）
     * @param sqlId  配置SQL ID
     * @param parameterObject  查询入参
     * @return
     */
    List <Record> findList(String sqlId, Object parameterObject);

    /**
     * 指定返回条数查询
     * @param sqlId 配置SQL ID
     * @param parameterObject 查询入参
     * @param limit 返回条数
     * @param returnClass 返回类型
     * @param <S>
     * @return
     */
    <S> List <S> findLimit(String sqlId, Object parameterObject, int limit, Class <S> returnClass);

    /**
     * 指定返回条数查询 （MAP类型返回）
     * @param sqlId 配置SQL ID
     * @param parameterObject 查询入参
     * @param limit  返回条数
     * @return
     */
    List <Record> findLimit(String sqlId, Object parameterObject, int limit);

    /**
     * 指定返回条数查询 （MAP类型返回）
     * @param sqlId 配置SQL ID
     * @param parameterObject 查询入参
     * @param pageable  开始，结束
     * @return
     */
    List <Record> findLimit(String sqlId, Object parameterObject, Pageable pageable);

    /**
     * 指定返回条数查询
     * @param sqlId 配置SQL ID
     * @param parameterObject 查询入参
     * @param pageable  开始，结束
     * @param returnClass 返回类型
     * @param <S>
     * @return
     */
    <S> List <S> findLimit(String sqlId, Object parameterObject,  Pageable pageable, Class <S> returnClass);

    /**
     * 指定一条数查询
     * @param sqlId 配置SQL ID
     * @param parameterObject 查询入参
     * @param returnClass 返回类型
     * @param <T>
     * @return
     */
    <S> S findOne(String sqlId, Object parameterObject, Class <S> returnClass);

    /**
     * 指定一条数查询（MAP类型返回）
     * @param sqlId  配置SQL ID
     * @param parameterObject  查询入参
     * @return
     */
    Record findOne(String sqlId, Object parameterObject);

    /**
     * 多线程并行查询
     * @param parallelQueries  并行查询类
     * @param parallelConfig 并行查询配置
     * @return
     */
    List<ParallelQueryResult> parallelQuery(List<ParallelQuery> parallelQueries, ParallelQueryConfig parallelConfig);

    /**
     * 执行删除或修改
     * @param sqlId 配置SQL ID
     * @param parameterObject 查询入参
     * @return
     */
    int executeSql(String sqlId,Object parameterObject);
}

 